package cn.gs.util;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
  
public class ObjectToXMLUtil {  
  
    /** 
     * 把java的可序列化的对象(实现Serializable接口)序列化保存到XML文件里面,如果想一次保存多个可序列化对象请用集合进行封装 
     * 保存时将会用现在的对象原来的XML文件内容 
     *  
     * @param obj 
     *            要序列化的可序列化的对象 
     * @param fileName 
     *            带完全的保存路径的文件名 
     * @throws FileNotFoundException 
     *             指定位置的文件不存在 
     * @throws IOException 
     *             输出时发生异常 
     * @throws Exception 
     *             其他运行时异常 
     */  
    public void objectXmlEncoder(Object obj, String fileName) {  
        // 创建输出文件  
        File fo = new File(fileName);  
        // 文件不存在,就创建该文件  
        if (!fo.exists()) {  
            // 先创建文件的目录  
            String path = fileName.substring(0, fileName.lastIndexOf('.'));  
            File pFile = new File(path);  
            pFile.mkdirs();  
        }  
        // 创建文件输出流  
        FileOutputStream fos = null;  
        XMLEncoder encoder = null;  
        try {  
            fos = new FileOutputStream(fo);  
            // 创建XML文件对象输出类实例  
            encoder = new XMLEncoder(fos);  
            // 对象序列化输出到XML文件  
            encoder.writeObject(obj);  
            encoder.flush();  
            // 关闭序列化工具  
            encoder.close();  
            // 关闭输出流  
            fos.close();  
        } catch (Exception e) {  
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, e);
        } finally {  
            if (encoder != null) {  
                encoder.close();  
            }  
            if (fos != null) {  
                try {  
                    fos.close();  
                } catch (IOException e) {  
                    Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, e);
                }  
            }  
        }  
    }  
  
    /** 
     * 读取由objSource指定的XML文件中的序列化保存的对象,返回的结果经过了List封装 
     *  
     * @param objSource 
     *            带全部文件路径的文件全名 
     * @return 由XML文件里面保存的对象构成的List列表(可能是一个或者多个的序列化保存的对象) 
     * @throws FileNotFoundException 
     *             指定的对象读取资源不存在 
     * @throws IOException 
     *             读取发生错误 
     * @throws Exception 
     *             其他运行时异常发生 
     */  
    public Object objectXmlDecoder(String objSource) {  
        File fin = new File(objSource);  
        FileInputStream fis = null;  
        XMLDecoder decoder = null;  
        try {  
            fis = new FileInputStream(fin);  
            decoder = new XMLDecoder(fis);  
            Object obj = null;  
            while ((obj = decoder.readObject()) != null) {  
                return obj;
            }  
        } catch (Exception e1) {  
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, e1);
        } finally {  
            if (decoder != null) {  
                decoder.close();  
            }  
            if (fis != null) {  
                try {  
                    fis.close();  
                } catch (IOException e) {  
                    Logger.getLogger(this.getClass().getName()).log(Level.WARNING, null, e);
                }  
            }  
        } 
        return null;
    }  
  
}  
